package com.atguigu.upp.mapper;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;

/**
 * Created by Smexy on 2023/1/4
 */
public interface ClickHouseMapper
{
    //创建宽表。无法制作为分区表。
    // 原因： 每一天计算的标签是不确定，造成宽表列的数量不确定。只能是每一天的结果单独保存一张表
    @Update(" create table if not exists ${t} ( uid String ,  ${tag}  ) engine=MergeTree order by uid ")
    void createWideTable(@Param("t") String table,@Param("tag") String tagColumn);

    //为了保障幂等性，每次向宽表中写数据时，先删除之前已经建好的宽表
    /*
        #{xx}
        ${xx}: 拼接表名，一定使用${}
     */
    @Delete("drop table if exists ${t} ")
    void dropWideTable(@Param("t") String table);

    //任务三： 写入bitmap到ck
    //为了保障幂等性，写每一天的数据时，先删除今天要写的分区的数据，保证数据只有一份
    @Update(" alter table ${t} delete where dt = #{dt} ")
    void dropBitmapToday(@Param("dt") String doDate,@Param("t") String table);

    /*
        生成bitmap写入
  insert into user_tag_value_string
 select
     col1.1 tagCode,col1.2 tagValue,groupBitmapState(uid)
from
    (
    select
    uid,
     arrayJoin([
         ('gender', gender),
         ('agegroup', agegroup),
         ('favor', favor)
         ]) col1
 from user_tag_merge
 where length(uid) > 0
    ) tmp
group by col1.1,col1.2;

        细节部分：
                ①补充业务日期作为分区字段
                ②将写入的数据按照tagValueType分为四张表，表名需要指定
                ③ us AggregateFunction(groupBitmap,UInt64)
                        源表(宽表)中的uid是String类型，要的函数，只接收UInt64类型的参数
                ④tagValue也是从源表中查询
                        在源表中，统一都使用的是String，但是某些数值类型，如果不存在，在源表中显示的是'',例如最近7天消费金额。
                        但是在写入到目标表时，目标表只接收decimal64(2),需要把 '' 转换为 decimal64(2)
                 ⑤每天计算的标签数量是不确定的，因此 arrarJoin(xxx ) ,xxx动态生成
                 ⑥每天查询的宽表名是不确定的，宽表名字也是一个参数
                 ⑦正常情况无需处理。
                        有些同学，数仓中有脏数据。
                            表现:
                                id,birthday
                                null,xxx
     */
    @Insert(" insert into ${t} " +
            " select col1.1 tagCode,if(col1.2 = '','0',col1.2) tagValue,groupBitmapState(toUInt64(uid)) us, #{dt} from  ( " +
            " select  uid, arrayJoin([ ${tagSql}  ]) col1  " +
           "  from  ${source} where length(uid) > 0 ) tmp " +
           "  group by col1.1,col1.2 ")
    void insertBitmapToCk(@Param("t") String table,@Param("dt") String doDate,@Param("tagSql") String tagSql,@Param("source") String sourceTable);

}
